using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Sparrow.Binary;
using Sparrow.Server;
using Sparrow.Threading;
using Tests.Infrastructure;
using Voron.Data.Containers;
using Voron.Util.PFor;
using Xunit;
using Xunit.Abstractions;

namespace FastTests.Voron.Util;

public unsafe class PForEncoderTests(ITestOutputHelper output) : NoDisposalNeeded(output)
{
    [RavenTheory(RavenTestCategory.Core)]
    [InlineData("SmallBufferSizeMisleading")]
    [InlineData("GreaterThan42B")]
    [InlineData("GreaterThan42B-Truncated")] // this ensures the >4.2B is on the last varint block
    [InlineData("SmallBufferMisleading2")]
    public void CanRoundTripSmallContainer(string name)
    {
        using var bsc = new ByteStringContext(SharedMultipleUseFlag.None);
        using var encoder = new FastPForEncoder(bsc);
        var array = ReadNumbers(name);

        fixed (byte* buffer = new byte[Container.MaxSizeInsideContainerPage])
        {
            int size;
            fixed (long* l = array)
            {
                size = encoder.Encode(l, array.Length);
                Assert.True(size < Container.MaxSizeInsideContainerPage);
                (int count, int sizeUsed) = encoder.Write(buffer, Container.MaxSizeInsideContainerPage);
                Assert.True(sizeUsed <= Container.MaxSizeInsideContainerPage);
                Assert.Equal(array.Length, count);
            }

            var output = new long[Bits.PowerOf2(array.Length)];
            using var decoder = new FastPForDecoder(bsc);
            decoder.Init(buffer, size);
            fixed (long* o = output)
            {
                int read = decoder.Read(o, output.Length);
                Assert.Equal(read, array.Length);
                Assert.Equal(array, output.Take(read));
            }
        }
    }
    
    [RavenFact(RavenTestCategory.Core)]
    public void CanRespectBufferBoundaryForPage()
    {
        using var bsc = new ByteStringContext(SharedMultipleUseFlag.None);
        using var encoder = new FastPForEncoder(bsc);
        var array = ReadNumbers("WriteTooMuchToBuffer");

        fixed(byte* buffer = new byte[8128])
        fixed (long* l = array)
        {
            var size = encoder.Encode(l, array.Length);
            (int count, int sizeUsed) = encoder.Write(buffer, 8128);
            Assert.True(sizeUsed <= 8128);
            (int count2, int sizeUsed2) = encoder.Write(buffer, 8128);
            Assert.True(sizeUsed2 <= 8128);
            Assert.Equal(array.Length, count + count2);
        }
    }

    [RavenFact(RavenTestCategory.Core)]
    public void CanRespectBufferBoundaryForPage2()
    {
        using var bsc = new ByteStringContext(SharedMultipleUseFlag.None);
        using var encoder = new FastPForEncoder(bsc);
        var array = new long[]
        {
            22650215428, 22650218500, 22650224644, 22650275844, 22650283012, 22650286084, 22650359812, 22650377220, 22650405892, 22650485764, 22650503172,
            22650638340, 22650707972, 22650744836, 22650804228, 22650846212, 22650856452, 22650958852, 22650986500, 22651025412, 22702846980, 22702888964,
            22702942212, 22702977028, 22703099908, 22703320068, 22703544324, 22703580164, 22703637508, 22703676420, 22703685636, 22703709188, 22703733764,
            22703749124, 22703809540, 22703858692, 22703878148, 22703904772, 22703989764, 22704093188, 22704158724, 22704178180, 22704208900, 22704240644,
            22704320516, 22704331780, 22704429060, 22704577540, 22704605188, 22704635908, 22704845828, 22704890884, 22704898052, 22704899076, 22704904196,
            22704995332, 22705004548, 22705031172, 22705185796, 22705190916, 22705354756, 22705363972, 22705380356, 22705610756, 22705656836, 22705768452,
            22705790980, 22705808388, 22705893380, 22705925124, 22705929220, 22706017284, 22706120708, 22706162692, 22706264068, 22706322436, 22706380804,
            22706408452, 22706572292, 22706670596, 22706692100, 22706707460, 22706755588, 22706778116, 22706789380, 22707035140, 22707068932, 22707122180,
            22707181572, 22707257348, 22707311620, 22756060164, 22756128772, 22756159492, 22756215812, 22756219908, 22756331524, 22756414468, 22756421636,
            22756442116, 22756487172, 22756505604, 22756647940, 22756789252, 22756857860, 22756924420, 22756936708, 22756972548, 22756992004, 22757032964,
            22757048324, 22757049348, 22757070852, 22757157892, 22757199876, 22757313540, 22757330948, 22757343236, 22757383172, 22757408772, 22757486596,
            22757487620, 22757594116, 22757625860, 22757679108, 22757682180, 22757710852, 22757722116, 22757767172, 22757770244, 22757879812, 22757880836,
            22757992452, 22758050820, 22758054916, 22758176772, 22758245380, 22758505476, 22758581252, 22758940676, 22759047172, 22759232516, 22759236612,
            22759325700, 22759330820, 22759334916, 22759339012, 22759448580, 22759454724, 22759460868, 22759477252, 22759555076, 22759575556, 22759610372,
            22759654404, 22759700484, 22759746564, 22759862276, 22759962628, 22820983812, 22821069828, 22821185540, 22821234692, 22821340164, 22821611524,
            22821668868, 22821685252, 22821716996, 22821746692, 22821795844, 22821815300, 22821963780, 22822009860, 22822031364, 22822092804, 22822138884,
            22822152196, 22822171652, 22822199300, 22822213636, 22822218756, 22822240260, 22822270980, 22822281220, 22822308868, 22822395908, 22822418436,
            22822477828, 22822492164, 22822532100, 22822598660, 22822604804, 22822623236, 22822643716, 22822685700, 22822692868, 22822702084, 22822705156,
            22822820868, 22822960132, 22823004164, 22823188484, 22823299076, 22823309316, 22823422980, 22823458820, 22823477252, 22823493636, 22823510020,
            22823519236, 22823606276, 22823702532, 22823703556, 22823763972, 22823848964, 22823938052, 22823976964, 22824015876, 22824077316, 22824095748,
            22824117252, 22824144900, 22824186884, 22824223748, 22824464388, 22824544260, 22824574980, 22824671236, 22824924164, 22825032708, 22825078788,
            22825079812, 22825094148, 22825157636, 22825187332, 22825193476, 22825379844, 22825474052, 22825597956, 22825765892, 22825788420, 22825796612,
            22825814020, 22825924612, 22825959428, 22826021892, 22826144772, 22882553860, 22882589700, 22882704388, 22882707460, 22882824196, 22882838532,
            22882944004, 22883134468, 22883180548, 22883241988, 22883310596, 22883338244, 22883436548, 22883460100, 22883544068, 22883698692, 22883821572,
            22883856388, 22883858436, 22884154372, 22884243460, 22884269060, 22884280324, 22884332548, 22884424708, 22884469764, 22884496388, 22884505604,
            22884554756, 22884658180, 22884784132, 22884806660, 22884808708, 22884865028, 22884923396, 22884937732, 22885160964, 22885275652, 22885313540,
            22885340164, 22885349380, 22885362692, 22885370884, 22885504004, 22885749764, 22885752836, 22885921796, 22885956612, 22885970948, 22885998596,
            22886048772, 22886389764, 22886418436, 22886449156, 22886464516, 22886519812, 22886735876, 22887180292, 22887267332, 22887286788, 22887298052,
            22887370756, 22887388164, 22887402500, 22887444484, 22887559172, 22887630852, 22887677956, 22944666628, 22944753668, 22944768004, 22944776196,
            22945077252, 22945098756, 22945132548, 22945173508, 22945219588, 22945230852, 22945263620, 22945302532, 22945312772, 22945354756, 22945375236,
            22945533956, 22945703940, 22945747972, 22945920004, 22945959940, 22946045956, 22946198532, 22946344964, 22946347012, 22946440196, 22946484228,
            22946502660, 22946824196, 22947131396, 22947204100, 22947468292, 22947493892, 22947517444, 22947576836, 22947662852, 22947664900, 22947747844,
            22947821572, 22947826692, 22947835908, 22947938308, 22948012036, 22948041732, 22948107268, 22948664324, 22948692996, 22948725764, 23003083780,
            23003345924, 23003425796, 23003663364, 23003685892, 23003699204, 23003721732, 23003744260, 23003789316, 23003991044, 23004071940, 23004498948,
            23004635140, 23004660740, 23004685316, 23004734468, 23004755972, 23004774404, 23004896260, 23005352964, 23005454340, 23005485060, 23058727940,
            23058833412, 23058886660, 23058963460, 23059043332, 23059206148, 23059311620, 23059385348, 23117281284, 23117300740, 23117369348, 23117394948,
            23117434884, 23117621252, 23117817860, 23117827076, 23117924356, 23117956100, 23117978628, 23117988868, 23118017540, 23118047236, 23118123012,
            23118238724, 23118379012, 23118518276, 23118779396, 23118993412, 23119010820, 23119075332, 23119092740, 23119389700, 23119447044, 23119609860,
            23120130052, 23120147460, 23120204804, 23120236548, 23120239620, 23120291844, 23120526340, 23120529412, 23120663556, 23120670724, 23121000452,
            23121041412, 23121316868, 23121402884, 23121560580, 23121855492, 23121886212, 23121895428, 23121988612, 23122113540, 23122193412, 23122236420,
            23122418692, 23122490372, 23122543620, 23122670596, 23170396164, 23170632708, 23170689028, 23170739204, 23170758660, 23170762756, 23170826244,
            23170876420, 23170951172, 23170977796, 23171019780, 23171039236, 23171058692, 23171130372, 23171230724, 23171252228, 23217501188, 23217504260,
            23217536004, 23217557508, 23217598468, 23217641476, 23217651716, 23217710084, 23218129924, 23218302980, 23218420740, 23218467844, 23218531332,
            23218538500, 23218619396, 23218790404, 23218795524, 23218801668, 23218833412, 23218859012, 23218925572, 23219195908, 23219231748, 23219374084,
            23219377156, 23219534852, 23219654660, 23219769348, 23220166660, 23220180996, 23220358148, 23220424708, 23220549636, 23220680708, 23220687876,
            23220717572, 23220752388, 23220995076, 23221024772, 23221040132, 23221085188, 23221163012, 23221192708, 23221237764, 23221517316, 23221519364,
            23221609476, 23271758852, 23271966724, 23271987204, 23272108036, 23272181764, 23272206340, 23272673284, 23272774660, 23272842244, 23272869892,
            23272904708, 23272922116, 23273037828, 23273179140, 23273353220, 23273422852, 23273511940, 23273566212, 23273612292, 23273906180, 23273946116,
            23274062852, 23274161156, 23274289156, 23274322948, 23274436612, 23274464260, 23274467332, 23274468356, 23274615812, 23274717188, 23274819588,
            23274821636, 23274851332, 23274856452, 23274894340, 23275001860, 23275081732, 23275129860, 23275168772, 23275478020, 23275533316, 23275541508,
            23275544580, 23275630596, 23275704324, 23321007108, 23321040900, 23321141252, 23321315332, 23321344004, 23321375748, 23321383940, 23321584644,
            23321678852, 23321706500, 23322084356, 23322127364, 23322259460, 23322293252, 23322322948, 23322341380, 23322346500, 23322387460, 23322486788,
            23322535940, 23322564612, 23322707972, 23322901508, 23322909700, 23323008004, 23323157508, 23323166724, 23323170820, 23323189252, 23323462660,
            23323475972, 23323551748, 23323801604, 23323900932, 23324049412, 23324323844, 23324421124, 23324493828, 23324559364, 23373327364, 23373413380,
            23373650948, 23373693956, 23373800452, 23374302212, 23374495748, 23374609412, 23374850052, 23374959620, 23375028228, 23375094788, 23375256580,
            23375478788, 23375528964, 23375549444, 23375594500, 23375604740, 23375799300, 23376260100, 23376366596, 23376405508, 23376413700, 23376553988,
            23376674820, 23376787460, 23376886788, 23377153028, 23377156100, 23377161220, 23377164292, 23429305348, 23429353476, 23429412868, 23429565444,
            23429853188, 23430098948, 23430289412, 23430498308, 23430505476, 23430589444, 23430660100, 23430682628, 23430794244, 23430841348, 23431085060,
            23431099396, 23431120900, 23431321604, 23431505924, 23431522308, 23431562244, 23431884804, 23432014852, 23432083460, 23432203268, 23432223748,
            23432453124, 23432470532, 23432561668, 23432757252, 23432796164, 23432847364, 23433082884, 23433103364, 23486665732, 23486668804, 23487137796,
            23487421444, 23487525892, 23487678468, 23487772676, 23487821828, 23487853572, 23487944708, 23488007172, 23488147460, 23488349188, 23488399364,
            23488400388, 23488409604, 23488514052, 23488515076, 23488762884, 23488850948, 23488875524, 23488931844, 23489091588, 23489096708, 23489143812,
            23489186820, 23489413124, 23489511428, 23489554436, 23489601540, 23489775620, 23489818628, 23489851396, 23490119684, 23490189316, 23490233348,
            23490279428, 23490293764, 23490314244, 23490504708, 23490568196, 23490589700, 23490699268, 23490737156, 23490778116, 23490783236, 23491013636,
            23491066884, 23491167236, 23547157508, 23547182084, 23547509764, 23547579396, 23547753476, 23547754500, 23547987972, 23548090372, 23548123140,
            23548333060, 23548360708, 23548375044, 23548389380, 23548440580, 23548474372, 23548519428, 23548538884, 23548623876, 23548930052, 23548949508,
            23548996612, 23549071364, 23549172740, 23549286404, 23549383684, 23549571076, 23549575172, 23549600772, 23549725700, 23549729796, 23549897732,
            23549908996, 23549943812, 23550164996, 23550304260, 23550331908, 23550519300, 23550527492, 23550570500, 23550580740, 23550724100, 23550764036,
            23550765060, 23550821380, 23550869508, 23550914564, 23550959620, 23551127556, 23551196164, 23551225860, 23551366148, 23551390724, 23551663108,
            23551666180, 23603289092, 23603526660, 23603630084, 23603634180, 23603681284, 23603768324, 23603935236, 23603987460, 23604073476, 23604088836,
            23604260868, 23604290564, 23604459524, 23604508676, 23604621316, 23604781060, 23604928516, 23604966404, 23604973572, 23604999172, 23605054468,
            23605152772, 23605216260, 23605265412, 23605285892, 23605356548, 23605398532, 23605456900, 23605572612, 23605854212, 23606087684, 23606450180,
            23657977860, 23658090500, 23658403844, 23658409988, 23658445828, 23658455044, 23659583492, 23659654148, 23660297220, 23660425220, 23660708868,
            23660874756, 23661166596, 23661211652, 23661310980, 23661350916, 23661427716, 23661594628, 23661597700, 23661640708, 23661716484, 23661830148,
            23661875204, 23662162948, 23662175236, 23662341124, 23662405636, 23662583812, 23662617604, 23707870212, 23707902980, 23708035076, 23708039172,
            23708344324, 23708750852, 23708803076, 23708903428, 23708957700, 23708963844, 23708995588, 23708997636, 23709120516, 23709240324, 23709252612,
            23709380612, 23709393924, 23709520900, 23709574148, 23710102532, 23710460932, 23710657540, 23710682116, 23710716932, 23710860292, 23711203332,
            23711399940, 23711428612, 23711474692, 23711475716, 23711524868, 23711687684, 23711719428, 23711742980, 23712073732, 23712109572, 23768881156,
            23768903684, 23768940548, 23769027588, 23769113604, 23769198596, 23769321476, 23769474052, 23769694212, 23769885700, 23770082308, 23770180612,
            23770275844, 23770461188, 23770613764, 23770902532, 23770903556, 23770946564, 23771067396, 23771160580, 23771216900, 23771257860, 23771346948,
            23771421700, 23771443204, 23771557892, 23771601924, 23772128260, 23772337156, 23772356612, 23772404740, 23772419076, 23772453892, 23772499972,
            23772554244, 23772558340, 23772649476, 23826795524, 23826830340, 23826896900, 23826942980, 23827045380, 23827184644, 23827235844, 23827465220,
            23827485700, 23827512324, 23827515396, 23827546116, 23827628036, 23827632132, 23827803140, 23827838980, 23827924996, 23828044804, 23828083716,
            23828103172, 23828163588, 23828273156, 23828459524, 23828520964, 23829030916, 23829059588, 23829212164, 23829260292, 23829279748, 23829513220,
            23829564420, 23829770244, 23830056964, 23830291460, 23830534148, 23883332612, 23883377668, 23883409412, 23883433988, 23883436036, 23883444228,
            23883834372, 23883905028, 23884110852, 23884412932, 23884480516, 23884548100, 23884608516, 23884766212, 23884851204, 23884865540, 23885026308,
            23885105156, 23885350916, 23885598724, 23885618180, 23885691908, 23885752324, 23885785092, 23885851652, 23885921284, 23886044164, 23886048260,
            23886154756, 23886162948, 23886258180, 23886301188, 23886641156, 23886668804, 23886670852, 23886714884, 23886889988, 23886912516, 23886928900,
            23887003652, 23887133700, 23887289348, 23887332356, 23887360004, 23940407300, 23940415492, 23940431876, 23940452356, 23940508676, 23940511748,
            23940589572, 23940730884, 23940820996, 23940860932, 23940985860, 23941081092, 23941152772, 23941219332, 23941257220, 23941317636, 23941504004,
            23941659652, 23941690372, 23941824516, 23942110212, 23942450180, 23942596612, 23942979588, 23943323652, 23943459844, 23943536644, 23989877764,
            23990073348, 23990131716, 23990374404, 23990605828, 23990796292, 23991060484, 23991156740, 23991171076, 23991191556, 23991299076, 23991530500,
            23991560196, 23991763972, 23991883780, 23992082436, 23992133636, 23992151044, 23992364036, 23992787972, 23992813572, 23992911876, 23992951812,
            23993369604, 23993594884, 23993832452, 24046681092, 24046859268, 24046903300, 24046940164, 24047025156, 24047564804, 24047745028, 24047995908,
            24048171012, 24048321540, 24048530436, 24048566276, 24048759812, 24048939012, 24049303556, 24049818628, 24049942532, 24050341892, 24050393092,
            24050448388, 24050453508, 24050529284, 24050532356, 24050533380, 24050594820, 24050607108, 24050610180, 24050722820, 24050945028, 24103902212,
            24104448004, 24104509444, 24104855556, 24104974340, 24105039876, 24105041924, 24105101316, 24105322500, 24105525252, 24105682948, 24105796612,
            24105801732, 24105814020, 24105845764, 24105957380, 24106136580, 24106302468, 24106348548, 24106486788, 24106569732, 24106606596, 24106906628,
            24107085828, 24107090948, 24107114500, 24107224068, 24107385860, 24107893764, 24108067844, 24108215300, 24108273668, 24108302340, 24108359684,
            24161677316, 24161965060, 24161969156, 24162066436, 24162298884, 24162661380, 24162725892, 24163236868, 24163506180, 24163749892, 24163932164,
            24163958788, 24164215812, 24164240388, 24164492292, 24164544516, 24164759556, 24165240836, 24165348356, 24165406724, 24165511172, 24213855236,
            24214120452, 24214337540, 24214589444, 24214605828, 24214608900, 24214647812, 24214723588, 24214852612, 24215231492, 24215500804, 24215595012,
            24215597060, 24216062980, 24216127492, 24216129540, 24216202244, 24216291332, 24216360964, 24216410116, 24217042948, 24217116676, 24217160708,
            24217296900, 24217495556, 24217580548, 24217662468, 24217788420, 24218072068, 24247144452, 24269752324, 24269776900, 24269886468, 24270048260,
            24270141444, 24270154756, 24270393348, 24270502916, 24270685188, 24270980100, 24271099908, 24271455236, 24271510532, 24271623172, 24271688708,
            24271799300, 24271858692, 24271916036, 24272000004, 24272489476, 24272510980, 24272523268, 24272524292, 24272536580, 24272542724, 24272598020,
            24272603140, 24272710660, 24272723972, 24272847876, 24273129476, 24273261572, 24273348612, 24273351684, 24273569796, 24273581060, 24273614852,
            24325063684, 24325208068, 24325222404, 24325328900, 24325347332, 24325480452, 24325803012, 24325811204, 24325923844, 24326071300, 24326180868,
            24326385668, 24326474756, 24326505476, 24326541316, 24326565892, 24326820868, 24327248900, 24327309316, 24327312388, 24327358468, 24327427076,
            24327651332, 24327706628, 24327883780, 24328068100, 24328236036, 24328275972, 24328438788, 24328455172, 24328736772, 24328792068, 24329284612,
            24383765508, 24383947780, 24384064516, 24384134148, 24384207876, 24384270340, 24384288772, 24384334852, 24384588804, 24384630788, 24384826372,
            24385153028, 24385668100, 24385857540, 24386002948, 24386594820, 24386614276, 24387053572, 24387167236, 24387290116, 24387367940, 24444389380,
            24444497924, 24444644356, 24444718084, 24444948484, 24445053956, 24445276164, 24445470724, 24445528068, 24445588484, 24445606916, 24445774852,
            24445782020, 24446036996, 24446188548, 24446552068, 24446623748, 24446702596, 24446716932, 24446766084, 24446918660, 24447000580, 24447010820,
            24447036420, 24447088644, 24447253508, 24447496196, 24447611908, 24447619076, 24447684612, 24447981572, 24448032772, 24448125956, 24448307204,
            24448311300, 24448335876, 24448385028, 24507387908, 24507410436, 24507505668, 24507572228, 24507607044, 24507641860, 24507780100, 24507802628,
            24507845636, 24507924484, 24508510212, 24508593156, 24508747780, 24508798980, 24508918788, 24509031428, 24509304836, 24570334212, 24570357764,
            24570423300, 24570523652, 24570771460, 24570835972, 24571075588, 24571087876, 24571400196, 24571428868, 24571485188, 24571947012, 24572094468,
            24572590084, 24572709892, 24572729348, 24572849156, 24573040644, 24573555716, 24574026756, 24574091268, 24574094340, 24574222340, 24574528516,
            24574595076, 24574716932, 24574759940, 24574998532, 24575033348, 24575060996, 24575170564, 24575347716, 24575422468, 24575427588, 24575433732,
            24624133124, 24624184324, 24624190468, 24624227332, 24624250884, 24677944324, 24678226948, 24678292484, 24678641668, 24678668292, 24678751236,
            24678919172, 24679060484, 24679327748, 24679496708, 24680257540, 24680346628, 24680368132, 24680838148, 24725018628, 24725837828, 24725865476,
            24726258692, 24726276100, 24726335492, 24726521860, 24726677508, 24726682628, 24726932484, 24727140356, 24727374852, 24727390212, 24727420932,
            24727428100, 24727467012, 24727774212, 24727787524, 24727830532, 24727943172, 24728136708, 24728199172, 24728200196, 24728480772, 24782626820,
            24782744580, 24782792708, 24782910468, 24783124484, 24783396868, 24783435780, 24783584260, 24783642628, 24783699972, 24783872004, 24784065540,
            24784110596, 24784190468, 24784392196, 24784683012, 24784687108, 24784750596, 24785289220, 24785560580, 24786195460, 24786230276, 24786259972,
            24840612868, 24840758276, 24840790020, 24840865796, 24841040900, 24841043972, 24841417732, 24841454596, 24841650180, 24842043396, 24842280964,
            24842286084, 24842292228, 24842310660, 24842350596, 24842506244, 24842528772, 24842658820, 24842682372, 24843042820, 24843053060, 24843305988,
            24843354116, 24843421700, 24843559940, 24843566084, 24843595780, 24843696132, 24843697156, 24843748356, 24843782148, 24843900932, 24843919364,
            24844010500, 24844076036, 24844145668, 24844811268, 24844917764, 24844940292, 24896629764, 24896648196, 24896844804, 24897086468, 24897179652,
            24897319940, 24897484804, 24897780740, 24897797124, 24897856516, 24898341892, 24898433028, 24898462724, 24898595844, 24899135492, 24899247108,
            24899333124, 24899659780, 24900068356, 24900085764, 24948171780, 24948318212, 24948359172, 24948520964, 24948867076, 24949001220, 24949384196,
            24949666820, 24949939204, 24950086660, 24950220804, 24950232068, 24950247428, 24950371332, 24950437892, 24950460420, 24950851588, 24950874116,
            24950890500, 24950949892, 24950971396, 24951067652, 24951151620, 24951180292, 25006176260, 25006615556, 25006763012, 25006799876, 25007056900,
            25007110148, 25007118340, 25007302660, 25007540228, 25007589380, 25007901700, 25008001028, 25008004100, 25008193540, 25008265220, 25008847876,
            25008923652, 25009441796, 25009476612, 25009502212, 25009800196, 25009892356, 25010021380, 25010044932, 25010393092, 25010638852, 25010964484,
            25011022852, 25063589892, 25063627780, 25063640068, 25063672836, 25064469508, 25064496132, 25064948740, 25065282564, 25065387012, 25065480196,
            25065866244, 25066179588, 25066444804, 25066548228, 25067003908, 25067088900, 25067360260, 25067374596, 25067403268, 25067435012, 25067561988,
            25121952772, 25122273284, 25122484228, 25122493444, 25122589700, 25122640900, 25122704388, 25122711556, 25122716676, 25122942980, 25123123204,
            25123378180, 25123829764, 25124592644, 25124950020, 25125749764, 25125921796, 25174629380, 25174771716, 25174780932, 25174796292, 25174846468,
            25175128068, 25175891972, 25176092676, 25176590340, 25176781828, 25177022468, 25177478148, 25177546756, 25177603076, 25177637892, 25177782276,
            25177848836, 25178006532, 25178134532, 25178529796, 25178536964, 25178679300, 25178725380, 25228818436, 25228830724, 25228875780, 25229362180,
            25229442052, 25229530116, 25229640708, 25229886468, 25230036996, 25231412228, 25231720452, 25232033796, 25232406532, 25280208900, 25280254980,
            25280518148, 25280674820, 25280960516, 25280994308, 25338457092, 25338874884, 25338888196, 25338902532, 25338958852, 25339158532, 25339920388,
            25340397572, 25340576772, 25340581892, 25340877828, 25341566980, 25341822980, 25342220292, 25342767108, 25393104900, 25393138692, 25393673220,
            25393728516, 25393884164, 25394329604, 25394338820, 25394354180, 25394503684, 25394920452, 25395067908, 25395165188, 25395409924, 25395422212,
            25395427332, 25395613700, 25395734532, 25396541444, 25451220996, 25451669508, 25452028932, 25452172292, 25452234756, 25452510212, 25452831748,
            25452855300, 25453035524, 25453050884, 25453237252, 25454474244, 25454635012, 25454669828, 25454766084, 25454888964, 25505146884, 25505229828,
            25505306628, 25505577988, 25505803268, 25505957892, 25505960964, 25505995780, 25506163716, 25506330628, 25506394116, 25507066884, 25507250180,
            25508051972, 25508111364, 25508129796, 25508469764, 25508605956, 25508692996, 25552999428, 25553104900, 25553296388, 25553410052, 25553620996,
            25553658884, 25553665028, 25554392068, 25554555908, 25554596868, 25554642948, 25554775044, 25554828292, 25554845700, 25555323908, 25555796996,
            25555850244, 25555893252, 25555976196, 25556190212, 25613114372, 25613184004, 25613203460, 25613502468, 25613550596, 25613559812, 25613583364,
            25613645828, 25613802500, 25613874180, 25613969412, 25614430212, 25614443524, 25614881796, 25615161348, 25615253508, 25615661060, 25615670276,
            25615780868, 25615794180, 25615930372, 25616054276, 25616260100, 25616483332, 25616582660, 25616636932, 25616942084, 25616945156, 25616990212,
            25616992260, 25617004548, 25617229828, 25669484548, 25669509124, 25669514244, 25669627908, 25669871620, 25669912580, 25670049796, 25670358020,
            25670370308, 25670514692, 25670763524, 25670800388, 25671141380, 25671176196, 25671235588, 25672109060, 25672111108, 25672269828, 25672355844,
            25673099268, 25673460740, 25728822276, 25729250308, 25729266692, 25729572868, 25729579012, 25729598468, 25729862660, 25729890308, 25729911812,
            25730021380, 25730076676, 25730149380, 25730473988, 25730480132, 25730929668, 25732098052, 25732301828, 25732644868, 25786271748, 25786400772,
            25786735620, 25786925060, 25787353092, 25787379716, 25787417604, 25787440132, 25843248132, 25843249156, 25843318788, 25843530756, 25843534852,
            25843570692, 25843826692, 25843868676, 25844167684, 25844217860, 25844299780, 25844541444, 25844744196, 25845633028, 25845743620, 25845898244,
            25845944324, 25846710276, 25898059780, 25898082308, 25898988548, 25899290628, 25899583492, 25899663364, 25899732996, 25900115972, 25900343300,
            25900555268, 25900635140, 25900977156, 25901681668, 25901759492, 25955017732, 25955074052, 25955194884, 25955248132, 25956213764, 25956302852,
            25956455428, 25956466692, 25956609028, 25956690948, 25956699140, 25957088260, 25958247428, 26009970692, 26010257412, 26011251716, 26011445252,
            26011528196, 26012417028, 26012499972, 26012596228, 26012651524, 26012698628, 26012887044, 26012890116, 26012937220, 26012976132, 26013068292,
            26013090820, 26013220868, 26013667332, 26013694980, 26013851652, 26014449668, 26067478532, 26068459524, 26068543492, 26068724740, 26068944900,
            26069003268, 26069268484, 26069429252, 26069687300, 26069787652, 26069796868, 26069810180, 26070086660, 26070165508, 26071054340, 26125595652,
            26125634564, 26126235652, 26126523396, 26126744580, 26126753796, 26127284228, 26127470596, 26127510532, 26128235524, 26128343044, 26128962564,
            26183620612, 26183701508, 26184450052, 26185172996, 26185290756, 26185410564, 26185684996, 26185734148, 26186055684, 26186523652, 26186784772,
            26187008004, 26187077636, 26187239428, 26243593220, 26243633156, 26244054020, 26244114436, 26244637700, 26244643844, 26244680708, 26244807684,
            26244870148, 26245363716, 26245467140, 26245785604, 26246013956, 26247101444, 26302057476, 26302367748, 26302405636, 26302974980, 26303066116,
            26303075332, 26303242244, 26303244292, 26303311876, 26303373316, 26304332804, 26304470020, 26304543748, 26305632260, 26305803268, 26306188292,
            26306274308, 26306555908, 26359050244, 26359135236, 26359156740, 26359204868, 26359439364, 26359581700, 26359824388, 26359883780, 26360699908,
            26360994820, 26361227268, 26361283588, 26361346052, 26361512964, 26361546756, 26361603076, 26362049540, 26362678276, 26362693636, 26362818564,
            26362872836, 26416179204, 26417204228, 26417693700, 26417721348, 26418467844, 26418510852, 26418796548, 26419347460, 26419954692, 26419955716,
            26469683204, 26469861380, 26470142980, 26470686724, 26470762500, 26470817796, 26471553028, 26471676932, 26471724036, 26471966724, 26472012804,
            26472095748, 26472261636, 26473026564, 26533946372, 26534376452, 26534554628, 26534956036, 26535729156, 26536096772, 26536344580, 26536628228,
            26536990724, 26537153540, 26537526276, 26590796804, 26590861316, 26591209476, 26592449540, 26592548868, 26592677892, 26592960516, 26593067012,
            26593108996, 26593412100, 26593422340, 26594746372, 26594750468, 26645129220, 26646081540, 26646232068, 26646324228, 26646559748, 26646649860,
            26647163908, 26647302148, 26647374852, 26648309764, 26648631300, 26697881604, 26698247172, 26698398724, 26699195396, 26699569156, 26699821060,
            26700402692, 26700503044, 26700993540, 26701206532, 26701391876, 26701856772, 26702306308, 26755328004, 26755563524, 26755715076, 26756498436,
            26756546564, 26756768772, 26757145604, 26757994500, 26758007812, 26758052868, 26758237188, 26758332420, 26759052292, 26759071748, 26759291908,
            26759438340, 26810381316, 26811521028, 26811642884, 26813800452, 26861756420, 26861786116, 26861936644, 26862149636, 26862456836, 26862742532,
            26862904324, 26863016964, 26863519748, 26863685636, 26863787012, 26864238596, 26864888836, 26917640196, 26917772292, 26918318084, 26919164932,
            26919631876, 26919742468, 26919924740, 26919947268, 26920051716, 26920266756, 26920296452, 26920336388, 26920891396, 26921008132, 26980850692,
            26980948996, 26981202948, 26981303300, 26981329924, 26981957636, 26982715396, 26983302148, 26983486468, 26983545860, 26983836676, 26984040452,
            26984218628, 26984233988, 26984888324, 27046264836, 27046376452, 27047731204, 27048075268, 27048263684, 27048438788, 27048442884, 27049341956,
            27049763844, 27049771012, 27050227716, 27050386436, 27050500100, 27099283460, 27099399172, 27100092420, 27100341252, 27100375044, 27100405764,
            27100460036, 27158621188, 27158641668, 27158742020, 27159917572, 27161861124, 27162045444, 27216482308, 27217251332, 27217364996, 27217551364,
            27218276356, 27218732036, 27218976772, 27219639300, 27219836932, 27219996676, 27220297732, 27272886276, 27272899588, 27273063428, 27273680900,
            27273696260, 27273765892, 27273806852, 27273818116, 27327213572, 27327426564, 27327512580, 27327759364, 27327880196, 27328533508, 27328539652,
            27328778244, 27328796676, 27328944132, 27329882116, 27330142212, 27330475012, 27330949124, 27331510276, 27331547140, 27383582724, 27384309764,
            27384646660, 27384979460, 27385007108, 27385060356, 27385621508, 27385700356, 27387182084, 27441632260, 27441699844, 27442499588, 27442512900,
            27442630660, 27442883588, 27443240964, 27443296260, 27443356676, 27443741700, 27443818500, 27444300804, 27444798468, 27444806660, 27444903940,
            27504005124, 27504051204, 27504158724, 27504294916, 27504746500, 27504761860, 27560051716, 27560626180, 27561358340, 27561530372, 27561537540,
            27561720836, 27562307588, 27562817540, 27562847236, 27562897412, 27562985476, 27563474948, 27563622404, 27622755332, 27622985732, 27623053316,
            27624293380, 27624506372, 27624739844, 27625333764, 27625634820, 27626552324, 27626975236, 27682016260, 27682332676, 27683205124, 27683249156,
            27683682308, 27684594692, 27684931588, 27685187588, 27685999620, 27686226948, 27686319108, 27686406148, 27686522884, 27746549764, 27746624516,
            27747785732, 27747876868, 27749337092, 27749956612, 27750137860, 27750343684, 27750356996, 27750792196, 27750986756, 27812936708, 27812945924,
            27813478404, 27814251524, 27814288388, 27814695940, 27814793220, 27814962180, 27814965252, 27815837700, 27816460292, 27816475652, 27816640516,
            27816770564, 27817117700, 27817242628, 27817278468, 27868204036, 27868682244, 27868822532, 27869808644, 27870416900, 27870432260, 27870448644,
            27870663684, 27870775300, 27870871556, 27871625220, 27871763460, 27927200772, 27927711748, 27928415236, 27928696836, 27928996868, 27929467908,
            27929579524, 27929671684, 27929742340, 27930734596, 27930785796, 27981029380, 27981770756, 27981915140, 27982093316, 27982528516, 27982533636,
            27982625796, 27983757316, 28041711620, 28041961476, 28043016196, 28043408388, 28043557892, 28044052484, 28044208132, 28044640260, 28044759044,
            28045005828, 28101385220, 28101857284, 28102255620, 28102651908, 28102786052, 28103185412, 28103507972, 28104304644, 28104526852, 28105335812,
            28151348228, 28151627780, 28151828484, 28151906308, 28153016324, 28154361860, 28154435588, 28154447876, 28154470404, 28221587460, 28222904324,
            28222943236, 28223058948, 28223581188, 28223672324, 28224053252, 28224122884, 28224315396, 28224482308, 28224572420, 28225411076, 28225641476,
            28225660932, 28225842180, 28226031620, 28226564100, 28226696196, 28281234436, 28281581572, 28282452996, 28282524676, 28282786820, 28283026436,
            28283173892, 28283317252, 28283498500, 28283783172, 28284855300, 28284965892, 28348069892, 28348138500, 28349467652, 28349675524, 28349716484,
            28349940740, 28350274564, 28350329860, 28350349316, 28350761988, 28351234052, 28351513604, 28352681988, 28353070084, 28353195012, 28409252868,
            28410313732, 28411147268, 28411281412, 28411743236, 28412976132, 28477731844, 28480033796, 28480040964, 28480214020, 28481335300, 28481426436,
            28481743876, 28482481156, 28482737156, 28482827268, 28482937860, 28483180548, 28539203588, 28540350468, 28541373444, 28541428740, 28541535236,
            28541621252, 28541875204, 28542026756, 28542124036, 28542266372, 28542909444, 28601677828, 28601772036, 28602226692, 28602711044, 28602884100,
            28603318276, 28603720708, 28604124164, 28604769284, 28604806148, 28605246468, 28605420548, 28605511684, 28667759620, 28667786244, 28668023812,
            28670514180, 28670517252, 28670759940, 28670930948, 28671251460, 28671318020, 28672166916, 28724965380, 28725066756, 28725457924, 28725585924,
            28725746692, 28726254596, 28727315460, 28727685124, 28784369668, 28784434180, 28784437252, 28784438276, 28784495620, 28785184772, 28785311748,
            28785968132, 28787103748, 28787197956, 28787709956, 28837072900, 28837291012, 28837610500, 28837860356, 28838165508, 28838194180, 28838920196,
            28839323652, 28839356420, 28839642116, 28839993348, 28840291332, 28840571908, 28897009668, 28897507332, 28897984516, 28898618372, 28898925572,
            28898961412, 28899022852, 28899165188, 28899511300, 28900025348, 28900173828, 28900603908, 28900963332, 28957033476, 28957315076, 28957933572,
            28957947908, 28958511108, 28958697476, 28959289348, 28959469572, 28959506436, 28959705092, 28959990788, 28960230404, 28960445444, 29017739268,
            29017779204, 29018017796, 29018479620, 29018761220, 29019763716, 29076209668, 29076965380, 29077011460, 29078541316, 29079462916, 29079991300,
            29080730628, 29081061380, 29134730244, 29135019012, 29136720900, 29137970180, 29138208772, 29201820676, 29202691076, 29203109892, 29203292164,
            29203307524, 29203665924, 29203951620, 29204225028, 29204304900, 29204320260, 29204610052, 29204934660, 29205021700, 29205693444, 29206324228,
            29206801412, 29263653892, 29263778820, 29264066564, 29264812036, 29265012740, 29265328132, 29265682436, 29265853444, 29266490372, 29266733060,
            29267174404, 29320928260, 29321079812, 29321446404, 29321805828, 29323141124, 29323326468, 29323399172, 29381331972, 29381522436, 29381643268,
            29381798916, 29381825540, 29382013956, 29382067204, 29382223876, 29382513668, 29383230468, 29383846916, 29384360964, 29438580740, 29439240196,
            29439295492, 29439428612, 29440045060, 29440187396, 29440391172, 29440440324, 29440504836, 29440533508, 29440947204, 29441192964, 29441320964,
            29495677956, 29495950340, 29496280068, 29496283140, 29497324548, 29497832452, 29497929732, 29498214404, 29498235908, 29498525700, 29498702852,
            29498759172, 29498990596, 29499381764, 29499886596, 29500032004, 29500105732, 29558653956, 29559913476, 29560087556, 29560433668, 29561277444,
            29619345412, 29619500036, 29619916804, 29620085764, 29620173828, 29620182020, 29622853636, 29623150596, 29623488516, 29684747268, 29685067780,
            29685697540, 29685813252, 29686173700, 29686238212, 29686240260, 29686393860, 29686797316, 29687562244, 29687760900, 29688545284, 29688684548,
            29689166852, 29747050500, 29747947524, 29748077572, 29748694020, 29748983812, 29749394436, 29749823492, 29749867524, 29750711300, 29796622340,
            29799110660, 29799947268, 29852621828, 29852827652, 29853070340, 29853091844, 29853169668, 29853486084, 29854191620, 29854364676, 29854806020,
            29855447044, 29855864836, 29855979524, 29856424964, 29856728068, 29926249476, 29926462468, 29926618116, 29926716420, 29927611396, 29927783428,
            29928153092, 29928385540, 29929136132, 29929211908, 29929300996, 29929333764, 29930086404, 29930427396, 29931131908, 29986094084, 29986146308,
            29986368516, 29986620420, 29987456004, 29987888132, 29987961860, 29988180996, 29988669444, 29989130244, 29989656580, 29990141956, 29990419460,
            29990585348, 29991090180, 30049255428, 30049388548, 30049479684, 30049747972, 30049775620, 30049821700, 30050070532, 30050104324, 30050361348,
            30050462724, 30050833412, 30051871748, 30107364356, 30107707396, 30107890692, 30108087300, 30109592580, 30109811716, 30172518404, 30172871684,
            30173132804, 30173575172, 30173621252, 30173749252, 30174810116, 30175051780, 30175713284, 30176809988, 30229796868, 30230257668, 30230296580,
            30230345732, 30230857732, 30230939652, 30232639492, 30233472004, 30234110980, 30234157060, 30286989316, 30287196164, 30288351236, 30288521220,
            30289871876, 30290088964, 30291046404, 30291078148, 30291127300, 30291202052, 30291489796, 30291741700, 30347746308, 30349107204, 30349295620,
            30349475844, 30349497348, 30350164996, 30350785540, 30350821380, 30350862340, 30350929924, 30351097860, 30351457284, 30351620100, 30351643652,
            30405907460, 30405971972, 30406605828, 30406813700, 30407320580, 30408390660, 30458855428, 30459412484, 30459450372, 30459577348, 30459618308,
            30459672580, 30459907076, 30459920388, 30460176388, 30460405764, 30461661188, 30461684740, 30462331908, 30462382084, 30518908932, 30519187460,
            30519743492, 30519909380, 30520461316, 30520631300, 30521012228, 30521189380, 30521413636, 30521432068, 30521601028, 30522180612, 30579782660,
            30579827716, 30580395012, 30580747268, 30580899844, 30582927364, 30583330820, 30583737348, 30633294852, 30633454596, 30633949188, 30635231236,
            30635265028, 30635341828, 30636010500, 30638137348, 30638248964, 30696365060, 30697907204, 30698671108, 30699164676, 30699512836, 30745270276,
            30745402372, 30745816068, 30746023940, 30746531844, 30746784772, 30746810372, 30746908676, 30747003908, 30747644932, 30747826180, 30748221444,
            30748305412, 30748521476, 30748827652, 30749187076, 30812488708, 30812710916, 30812877828, 30813969412, 30815861764, 30816360452, 30816622596,
            30870548484, 30870725636, 30870746116, 30870803460, 30871163908, 30871907332, 30872574980, 30872969220, 30873874436, 30924892164, 30924943364,
            30981687300, 30982820868, 30983099396, 30984303620, 30984369156, 30984808452, 30985204740, 30986010628, 31040166916, 31040293892, 31040485380,
            31040606212, 31040740356, 31041842180, 31042029572, 31042076676, 31042804740, 31042905092, 31099731972, 31099847684, 31100151812, 31100731396,
            31100761092, 31100847108, 31102651396, 31102658564, 31102670852, 31103263748, 31103362052, 31162273796, 31162697732, 31162875908, 31162926084,
            31163193348, 31163642884, 31163747332, 31164015620, 31164728324, 31166253060, 31225318404, 31226830852, 31227228164, 31228348420, 31228488708,
            31286548484, 31288695812, 31288809476, 31289102340, 31289165828, 31289171972, 31344660484, 31344975876, 31344991236, 31345037316, 31345308676,
            31346255876, 31346594820, 31346821124, 31346963460, 31347267588, 31347443716, 31347788804, 31348253700, 31405487108, 31405633540, 31406103556,
            31406497796, 31406830596, 31407339524, 31408528388, 31408736260, 31408942084, 31409108996, 31460630532, 31460660228, 31521689604, 31522135044,
            31522672644, 31522673668, 31523836932, 31524002820, 31524566020, 31524610052, 31524943876, 31581852676, 31582212100, 31584245764, 31584282628,
            31584847876, 31585689604, 31585993732, 31586332676, 31640689668, 31641156612, 31641400324, 31641754628, 31641958404, 31642018820, 31642021892,
            31642618884, 31642718212, 31642927108, 31642972164, 31643738116, 31644323844, 31644525572, 31644773380, 31644790788, 31644977156, 31700653060,
            31701940228, 31702076420, 31702507524, 31702530052, 31703947268, 31761467396, 31763765252, 31763817476, 31764279300, 31764374532, 31764403204,
            31764559876, 31813684228, 31814048772, 31814242308, 31814322180, 31815739396, 31816074244, 31870570500, 31870571524, 31870765060, 31870816260,
            31873003524, 31873241092, 31874432004, 31874487300, 31874719748, 31926204420, 31926324228, 31926463492, 31926701060, 31926844420, 31927085060,
            31927336964, 31927768068, 31980555268, 31980719108, 31981453316, 32035732484, 32035970052, 32035971076, 32036553732, 32037030916, 32037110788,
            32037339140, 32037697540, 32039235588, 32096358404, 32096477188, 32096527364, 32096913412, 32097137668, 32097293316, 32097627140, 32097939460,
            32097967108, 32099021828, 32099025924, 32099202052, 32158583812, 32159918084, 32160403460, 32160645124, 32161406980, 32161505284, 32161601540,
            32161864708, 32161884164, 32161946628, 32162874372, 32162905092, 32220438532, 32220945412, 32221381636, 32221636612, 32221691908, 32222018564,
            32223257604, 32224230404, 32224630788, 32224653316, 32268526596, 32269427716, 32269922308, 32270099460, 32270518276, 32270989316, 32271465476,
            32272674820, 32322221060, 32322410500, 32322680836, 32323588100, 32323630084, 32323649540, 32324999172, 32325154820, 32325958660, 32326109188,
            32326212612, 32326232068, 32379525124, 32379728900, 32379928580, 32380112900, 32380113924, 32380948484, 32381555716, 32381601796, 32381946884,
            32383608836, 32383818756, 32383832068, 32449897476, 32450562052, 32452700164, 32454220804, 32454724612, 32510753796, 32511503364, 32511575044,
            32512600068, 32512697348, 32512878596, 32567900164, 32568486916, 32568759300, 32569155588, 32569575428, 32569612292, 32570766340, 32620904452,
            32621206532, 32621864964, 32623794180, 32623917060, 32624016388, 32625117188, 32683748356, 32684257284, 32684282884, 32685133828, 32685212676,
            32685941764, 32686322692, 32686896132, 32688080900, 32688153604, 32737167364, 32737597444, 32738596868, 32738729988, 32738766852, 32738964484,
            32740117508, 32740153348, 32740438020, 32740792324, 32741110788, 32795025412, 32795336708, 32795460612, 32796003332, 32796194820, 32796378116,
            32796706820, 32797538308, 32797730820, 32798383108, 32798931972, 32853451780, 32853522436, 32854454276, 32855262212, 32856508420, 32856678404,
            32912514052, 32913091588, 32913161220, 32913541124, 32913826820, 32913952772, 32914823172, 32915142660, 32915166212, 32915505156, 32916538372,
            32967213060, 32969168900, 32969442308, 32970036228, 32970152964, 32970223620, 32970267652, 33018475524, 33018649604, 33018820612, 33021014020,
            33021405188, 33021497348, 33071918084, 33072305156, 33072655364, 33072849924, 33073372164, 33074416644, 33075579908, 33076140036, 33130360836,
            33131579396, 33132555268, 33132814340, 33134454788, 33135009796, 33191948292, 33192569860, 33192715268, 33192927236, 33193273348, 33193481220,
            33193567236, 33194530820, 33194809348, 33195311108, 33195341828, 33195386884, 33195629572, 33195656196, 33196103684, 33246753796, 33247320068,
            33248097284, 33248205828, 33248293892, 33249568772, 33250109444, 33250447364, 33250506756, 33250871300, 33308958724, 33309507588, 33309748228,
            33311563780, 33312581636, 33313049604, 33313167364, 33313188868, 33369470980, 33369883652, 33370056708, 33370091524, 33370732548, 33371211780,
            33372041220, 33372419076, 33372658692, 33372947460, 33373600772, 33433126916, 33433146372, 33433254916, 33435307012, 33436154884, 33437232132,
            33437455364, 33437702148, 33488771076, 33489349636, 33490081796, 33490130948, 33490707460, 33491120132, 33491965956, 33492534276, 33492629508,
            33551951876, 33551989764, 33552052228, 33552486404, 33552566276, 33553423364, 33553573892, 33554200580, 33554865156, 33555048452, 33555506180,
            33556057092, 33556231172, 33556245508, 33613081604, 33615227908, 33615263748, 33615323140, 33662119940, 33665134596, 33720089604, 33720338436,
            33720367108, 33721406468, 33721854980, 33723629572, 33771573252, 33771640836, 33772307460, 33772521476, 33772877828, 33773174788, 33774490628,
            33774618628, 33774775300, 33775118340, 33836449796, 33836859396, 33837470724, 33837581316, 33837845508, 33838914564, 33839020036, 33839087620,
            33839110148, 33839185924, 33839582212, 33840413700, 33840943108, 33841033220, 33899873284, 33899949060, 33899991044, 33901066244, 33901142020,
            33902194692, 33902359556, 33903222788, 33903475716, 33957045252, 33957951492, 33959162884, 33959228420, 33959552004, 33959906308, 33960450052,
            33960731652, 33961249796, 34018110468, 34018322436, 34019553284, 34019933188, 34020799492, 34021484548, 34022521860, 34022522884, 34022616068,
            34074294276, 34074542084, 34076103684, 34122860548, 34171142148, 34171892740, 34171929604, 34171983876, 34172014596, 34172133380, 34173302788,
            34174923780, 34285652996, 34286736388, 34286864388, 34288001028, 34288266244, 34289298436, 34289768452, 34289881092, 34339896324, 34340242436,
            34340687876, 34340694020, 34340912132, 34382326788, 34382622724, 34382792708, 34384397316, 34384399364, 34385173508, 34385735684, 34385878020,
            34443628548, 34443920388, 34445302788, 34446740484, 34446998532, 34447682564, 34495003652, 34495841284, 34496533508, 34496706564, 34496990212,
            34496997380, 34497743876, 34498051076, 34498273284, 34498999300, 34499376132, 34499418116, 34555453444, 34555760644, 34555783172, 34556251140,
            34556331012, 34556947460, 34557351940, 34558003204, 34558064644, 34558359556, 34558655492, 34558900228, 34558907396, 34558993412, 34559812612,
            34613687300, 34617333764, 34617369604, 34673561604, 34673907716, 34675859460, 34676304900, 34727858180, 34728419332, 34728609796, 34728613892,
            34728719364, 34729098244, 34729175044, 34729852932, 34730481668, 34730668036, 34730888196, 34731549700, 34732229636, 34788734980, 34789063684,
            34789084164, 34790209540, 34839707652, 34839872516, 34840364036, 34840365060, 34840558596, 34841528324, 34842158084, 34843047940, 34900641796,
            34900659204, 34900734980, 34902193156, 34902474756, 34902599684, 34902734852, 34903048196, 48715540484, 73293058052, 103820275716, 122854682628,
            156795325444, 192693602308, 207281396740, 207914902532, 211238242308, 253642341380, 263906255876, 293100448772, 307906371588, 329579185156, 346428590084,
            368000896004, 399648030724, 408108319748, 408894050308, 424869593092, 432329566212, 437925079044, 438700669956, 455303983108, 460554193924, 460555953156,
            475628005380, 477864420356, 479038999556, 481415889924, 481417449476, 488105382920
        };

        var list = new List<long>();

        int outputCount = Bits.PowerOf2(array.Length);
        long[] outputBuffer = new long[outputCount];
        fixed (byte* buffer = new byte[8128])
        fixed (long* l = array)
        fixed (long* output = outputBuffer)
        {
            var size = encoder.Encode(l, array.Length);
            (int count, int sizeUsed) = encoder.Write(buffer, 8128);
            Assert.True(sizeUsed <= 8128);

            var decoder = new FastPForDecoder(bsc);
            decoder.Init(buffer, sizeUsed);
            var read = decoder.Read(output, outputCount);
            list.AddRange(outputBuffer[..read]);
            Assert.Equal(array.Take(read), outputBuffer.Take(read));
            Assert.Equal(count, read);

            new Span<byte>(buffer, 8128).Clear();
            
            (int count2, int sizeUsed2) = encoder.Write(buffer, 8128);
            Assert.True(sizeUsed2 <= 8128);
            Assert.Equal(array.Length, count + count2);
            
            
            decoder.Init(buffer, sizeUsed2);
            read = decoder.Read(output, outputCount);
            Assert.Equal(array.Skip(count).Take(read), outputBuffer.Take(read));
            Assert.Equal(count2, read);

            
            list.AddRange(outputBuffer[..read]);
            
            Assert.Equal(array, list.ToArray());
        }
    }

    private static long[] ReadNumbers(string name)
    {
        using var stream = typeof(PForEncoderTests).Assembly
            .GetManifestResourceStream(typeof(PForEncoderTests).Namespace + "."+ name + ".txt");
        using var reader = new StreamReader(stream);
        var list = new List<long>();
        while (true)
        {
            string line = reader.ReadLine();
            if (line == null)
                break;
            list.Add(long.Parse(line));
        }

        return list.ToArray();
    }
}
